/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package wasolicitudesfiec.logicacontrol.SolicitarCambioCarrera;

import com.sun.rave.web.ui.model.Option;
import entidad.Estudiante;
import entidad.Parametro;
import entidad.Profesor;
import entidad.cambioCarrera.Solicitudcambiocarrera;
import hero.interfaces.BnNodeValue;
import java.sql.SQLException;
import java.sql.Date;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.context.FacesContext;
import wasolicitudesfiec.CambioCarreraoEspecializacion.EstudianteSolicitaCambio;
import wasolicitudesfiec.general.MensajeException;
import wasolicitudesfiec.logicacontrol.CTRL_Base;

/**
 *
 * @author kabad
 */
public class CTRL_EstudianteSolicitaCambio extends CTRL_Base {

    private final String nombreProceso = "Solicitar Cambio de Carrera o Especializacion";
    private EstudianteSolicitaCambio gui;
    private final String nombreActividad = "Estudiante Solicita Cambio";
    private int idcarreraActual = 0;
    private int idespecializacionActual = 0;

    public CTRL_EstudianteSolicitaCambio(EstudianteSolicitaCambio gui, FacesContext facesContext) {
        super(facesContext);
        this.gui = gui;
    }

    public void inicializar() throws MensajeException {

        gui.getPanelNavegacion().getLblNavegacion().setText("Solicitud Cambio de Carrera/Especialización" + " -> " + nombreActividad);
        leerCarreraAtual();
        leerCarreras();

    }

    public void leerCarreras() {

        Option[] listaOpciones;
        Option tempOption;
        Vector<Parametro> listaCarreras;
        Parametro elemCarrera;
        try {
            listaCarreras = logica.leerCarreras();
            listaOpciones = new Option[listaCarreras.size()];
            for (int i = 0; i < listaCarreras.size(); i++) {
                elemCarrera = listaCarreras.get(i);
                tempOption = new Option();
                tempOption.setLabel(elemCarrera.getNombre());
                tempOption.setValue(elemCarrera.getIdParametro());
                listaOpciones[i] = tempOption;
            }
            gui.getDdlCarreraDefaultOptions().setOptions(listaOpciones);
            gui.getDdlCarrera().setSelected(listaOpciones[0].getValue());

        } catch (SQLException ex) {
            Logger.getLogger(CTRL_EstudianteSolicitaCambio.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void cambioEspecializacion() {

        Option[] listaOpciones;
        Option tempOption;
        Vector<Parametro> listaEspecializacion;
        Parametro elemEspecializacion;
        int idCarrera = gui.getCarreraSeleccionada();
        System.out.println("carrera " + idCarrera);
//        gui.getDdlCarrera().setSelected(gui.getCarreraSeleccionada());
        try {
            listaEspecializacion = logica.leerVariosParametroPorIdfkParent(idCarrera);
            listaOpciones = new Option[listaEspecializacion.size()];
            for (int i = 0; i < listaEspecializacion.size(); i++) {
                elemEspecializacion = listaEspecializacion.get(i);
                tempOption = new Option();
                tempOption.setLabel(elemEspecializacion.getNombre());
                tempOption.setValue((Integer)elemEspecializacion.getIdParametro());
                listaOpciones[i] = tempOption;
            }
            gui.getDdlEspecializacionDefaultOptions().setOptions(listaOpciones);
        } catch (SQLException ex) {
            Logger.getLogger(CTRL_EstudianteSolicitaCambio.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    private void leerCarreraAtual() throws MensajeException {
        /// este metodo debe leer la carreraActual del estudiante a traves del web service del csi y almacenarlo en dos
        //variables, para luego llevarlos a la base de datos
        //asumo que lo que devuelve el csi son Strings con los nombres de la carrera

        //revisar que pasa si no es posible obtener la carrera actual del estudiante
        String carreraActual = "Ingeniería en Computación";
        String especializacionActual = "Sistemas de Información";
        try {
            if (carreraActual == null) {
                throw new MensajeException("No ha sido posible obtener su carrera actual, por favor intente luego.");
            //recordar que si no encuentra la carrera o especializacion que haga match con los registros en la base los ids se inicializaron con 0
            }
            Vector<Parametro> listaCarreras;
            Vector<Parametro> listaEspecializaciones;
            Parametro elemCarrera, elemEspecializacion;

            listaCarreras = logica.leerCarreras();
            for (int i = 0; i < listaCarreras.size(); i++) {
                elemCarrera = listaCarreras.get(i);
                if (elemCarrera.getNombre().compareToIgnoreCase(carreraActual) == 0) {
                    idcarreraActual = elemCarrera.getIdParametro();
                    listaEspecializaciones = logica.leerVariosParametroPorIdfkParent(idcarreraActual);
                    for (int j = 0; j < listaEspecializaciones.size(); j++) {
                        elemEspecializacion = listaEspecializaciones.get(j);
                        if (elemEspecializacion.getNombre().compareToIgnoreCase(especializacionActual) == 0) {
                            idespecializacionActual = elemEspecializacion.getIdParametro();
                            break;
                        }
                    }
                    break;
                }
            }
            if (idcarreraActual != 0) {
                gui.getLblCarreraActual().setText(carreraActual + " especialización " + especializacionActual);
            } else {
                throw new MensajeException("No ha sido posible encontrar su carrera actual dentro de nuestra base de datos");  
            }
        } catch (MensajeException ex) {
            throw ex;
        } catch (Exception ex) {
             ex.printStackTrace();
              Logger.getLogger(CTRL_EstudianteSolicitaCambio.class.getName()).log(Level.SEVERE, null, ex);
             }
              
    }

    private Solicitudcambiocarrera llenarDatosActividadEstudianteSolicitaCambio() throws MensajeException {
        Solicitudcambiocarrera solicitud = new Solicitudcambiocarrera();
        try {
            Vector<Parametro> listaEspecializacion = null;
            int idEspecializacion;
            int idCarreraNueva;
            int idCarrera = (Integer) gui.getDdlCarrera().getSelected();
            listaEspecializacion = logica.leerVariosParametroPorIdfkParent(idCarrera);
            
           if (listaEspecializacion.size() == 0) {
                //verificamos que la nueva carrera escogida no sea igual a la actual
                if (idCarrera == idcarreraActual) {
                    throw new MensajeException("Usted ya pertenece actualmente a esta carrera");
                }
                solicitud.setFkIdCarreraActual(idcarreraActual);
                solicitud.setFkIdCarreraNueva(idCarrera);
                idCarreraNueva = idCarrera;
            } else {               
               idEspecializacion = new Integer((String)gui.getDdlEspecializacion().getSelected()) ;           
                //verificamos que la nueva carrera escogida no sea igual a la actual
                if (idCarrera == idcarreraActual && idEspecializacion == idespecializacionActual) {
                    throw new MensajeException("Usted ya pertenece actualmente a esta carrera");
                }
                solicitud.setFkIdCarreraActual(idespecializacionActual);
                solicitud.setFkIdCarreraNueva(idEspecializacion);
                idCarreraNueva = idEspecializacion;
            }
            solicitud.setObservacionEstudiante((String) gui.getTxtObservacion().getText());
            Estudiante estudiante = logica.leerEstudiantePorUsuario(usuario.getUsuario());
            solicitud.setFkidestudiante(estudiante.getIdEstudiante());
            Profesor coordinador = logica.leerProfesorPorCarrera(idCarreraNueva);
            solicitud.setFkIdProfesor(coordinador.getIdProfesor());
            java.util.Date fecha = new java.util.Date();
          solicitud.setFechaActividad(new Date(fecha.getTime()));
          System.out.println("fecha " + new Date(fecha.getTime()));
        } catch (MensajeException ex) {
            throw ex;
        } catch (SQLException ex) {
            Logger.getLogger(CTRL_EstudianteSolicitaCambio.class.getName()).log(Level.SEVERE, null, ex);
        }
        return solicitud;
    }

    public void guardarActividadEstudianteSolicitaCambio() throws MensajeException {
        String nombreInstanciaProceso;
        BnNodeValue actividad;
        Solicitudcambiocarrera solicitudCambio;
        try {
            solicitudCambio = llenarDatosActividadEstudianteSolicitaCambio();
            
            if (!(usrSession != null && prjSession != null)) {
                throw new Exception();
            }
            prjSession.instantiateProject(nombreProceso);

            nombreInstanciaProceso = prjSession.getName();
            actividad = usrSession.getNode(nombreInstanciaProceso, nombreActividad);
            if (!(actividad != null &&
                    (actividad.getState() == hero.interfaces.Constants.Nd.READY ||
                    actividad.getState() == hero.interfaces.Constants.Nd.ANTICIPABLE))) {
                throw new Exception();
            }            
            solicitudCambio.setNombreInstanciaProceso(nombreInstanciaProceso);
            solicitudCambio = logica.getLogCambioCarrera().nuevoSolicitudCambio(solicitudCambio);
            prjSession.setProperty("idSolicitudProceso", solicitudCambio.getIdSolicitudCambioCarrera() + "");
            solicitudCambio = logica.getLogCambioCarrera().clonarSolicitudAyudantia(solicitudCambio);
            prjSession.setNodeProperty(nombreActividad, "idSolicitudActividad", solicitudCambio.getIdSolicitudCambioCarrera() + "");
            usrSession.startActivity(nombreInstanciaProceso, nombreActividad);
           usrSession.terminateActivity(nombreInstanciaProceso, nombreActividad);
            
        } catch (MensajeException ex) {
            throw ex;
        } catch (Exception ex) {
            ex.printStackTrace();            
             Logger.getLogger(CTRL_EstudianteSolicitaCambio.class.getName()).log(Level.SEVERE, null, ex);
            throw new MensajeException("No es posible guardar la solicitud. Intente luego de unos minutos.");
        }
    }
}
